﻿using System;
using System.Data;
using System.Data.SqlClient;

namespace hcom
{
	public class hData
	{
		/// <summary>
		/// 委托表达式，适用于头部和尾部代码都一样，中间代码不一样的情况，比如这里的数据库操作，打开，关闭和异常处理都是一样的，只有具体操作有区别（insert, select等）
		/// </summary>
		/// <typeparam name="T"></typeparam>
		/// <param name="cmdtext"></param>
		/// <param name="func"></param>
		/// <returns></returns>
		public T DoCommand<T>(string cmdtext, Func<SqlCommand, T> func)
		{
			System.Data.SqlClient.SqlConnection myConn = null;
			try
			{
				myConn = new System.Data.SqlClient.SqlConnection();
				myConn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ToString();
				myConn.Open();
				SqlCommand cmd = new SqlCommand(cmdtext);
				cmd.Connection = myConn;
				return func(cmd);
			}
			catch (Exception e)
			{
				throw (e);
			}
			finally
			{
				if (myConn != null)
					myConn.Close();
			}

		}

		/// <summary>
		/// 取数据集
		/// </summary>
		/// <param name="cmdtext">
		///		cmdtext 可以是表名，sqlect语句，存储过程。
		///		存储过程可以直接带参数，语法是 "存储过程名 参数1 参数2"
		/// </param>
		/// <returns>返回数据集</returns>
		public DataSet GetDataSet(string cmdtext)
		{
			return DoCommand(cmdtext, cmd =>
			{
				DataSet ds = new DataSet();
				SqlDataAdapter da = new SqlDataAdapter(cmd);
				da.Fill(ds);
				return ds;
			});
		}

		/// <summary>
		/// 把数据库表载入内存表
		/// </summary>
		/// <param name="cmdtext">
		///		cmdtext 可以是表名，sqlect语句，存储过程。
		///		存储过程可以直接带参数，语法是 "存储过程名 参数1 参数2"
		/// </param>
		/// <returns>返回表</returns>
		public DataTable GetTable(string cmdtext)
		{
			return DoCommand(cmdtext, cmd =>
			{
				DataTable dt = new DataTable();
				SqlDataAdapter da = new SqlDataAdapter(cmd);
				da.Fill(dt);
				return dt;
			});
		}

		/// <summary>
		/// 执行查询，并返回查询所返回的结果集中第一行的第一列。 忽略其他列或行。 
		/// </summary>
		/// <param name="sqlstr"></param>
		/// <returns>返回的结果集中第一行的第一列</returns>
		public object ExecuteScalar(string sqlstr)
		{
			return DoCommand(sqlstr, cmd => cmd.ExecuteScalar());
		}

		/// <summary>
		/// 执行select语句或存储过程。
		/// </summary>
		/// <param name="sqlstr"></param>
		/// <returns>返回插入或修改的行数，没有改变返回-1</returns>
		public int Execute(string sqlstr)
		{
			return DoCommand(sqlstr, cmd => cmd.ExecuteNonQuery());
		}

		/// <summary>
		/// 执行sqlstr语句，并返回新ID。 ?? 好象只能用于自增量ID.
		/// </summary>
		/// <param name="sqlstr"></param>
		/// <returns>返回新ID</returns>
		public object ExecuteReturnID(string sqlstr)
		{
			return DoCommand(sqlstr, cmd =>
			{
				cmd.ExecuteNonQuery();
				cmd.CommandText = "SELECT @@IDENTITY";
				return cmd.ExecuteScalar();
			});
		}


/*
		//public hData()
		//{
            //System.Configuration.ConnectionStringSettings s = System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"];
            //myConn = new System.Data.SqlClient.SqlConnection();
            //myConn.ConnectionString = s.ConnectionString;
        //}

		/// <summary>
		/// 取数据集
		/// </summary>
		/// <param name="cmdtext">
		///		cmdtext 可以是表名，sqlect语句，存储过程。
		///		存储过程可以直接带参数，语法是 "存储过程名 参数1 参数2"
		/// </param>
		/// <returns>返回数据集</returns>
		public DataSet GetDataSet(string cmdtext)
		{
			System.Data.SqlClient.SqlConnection myConn = null;
			try
			{
				myConn = new System.Data.SqlClient.SqlConnection( strConnection );
				myConn.Open();

				DataSet ds = new DataSet();
				SqlCommand cmd = new SqlCommand(cmdtext);
				cmd.Connection = myConn;
				SqlDataAdapter da = new SqlDataAdapter(cmd);
				da.Fill(ds);
				return ds;
			}
			catch (Exception e)
			{
				throw (e);
			}
			finally
			{
				if( myConn != null )
					myConn.Close();
			}
		}

		/// <summary>
		/// 把数据库表载入内存表
		/// </summary>
		/// <param name="cmdtext">
		///		cmdtext 可以是表名，sqlect语句，存储过程。
		///		存储过程可以直接带参数，语法是 "存储过程名 参数1 参数2"
		/// </param>
		/// <returns>返回表</returns>
		public DataTable GetTable(string cmdtext)
		{
			try
			{
				myConn.Open();

				DataTable dt = new DataTable();
				SqlCommand cmd = new SqlCommand(cmdtext);
				cmd.Connection = myConn;
				SqlDataAdapter da = new SqlDataAdapter(cmd);
				da.Fill(dt);
				return dt;
			}
			catch (Exception e)
			{
				throw (e);
			}
			finally
			{
				myConn.Close();
			}
		}

		/// <summary>
		/// 执行查询，并返回查询所返回的结果集中第一行的第一列。 忽略其他列或行。 
		/// </summary>
		/// <param name="sqlstr"></param>
		/// <returns>返回的结果集中第一行的第一列</returns>
		public object ExecuteScalar(string sqlstr)
		{
			try
			{
				myConn.Open();

				SqlCommand cmd = new SqlCommand(sqlstr);
				cmd.Connection = myConn;
				return cmd.ExecuteScalar();
			}
			catch (Exception e)
			{
				throw (e);
			}
			finally
			{
				myConn.Close();
			}
		}

		/// <summary>
		/// 执行select语句或存储过程。
		/// </summary>
		/// <param name="sqlstr"></param>
		/// <returns>返回插入或修改的行数，没有改变返回-1</returns>
		public int Execute(string sqlstr)
		{
			try
			{
				myConn.Open();

				SqlCommand cmd = new SqlCommand(sqlstr);
				cmd.Connection = myConn;
				return cmd.ExecuteNonQuery();
			}
			catch (Exception e)
			{
				throw (e);
			}
			finally
			{
				myConn.Close();
			}
		}

		/// <summary>
		/// 执行sqlstr语句，并返回新ID。 ?? 好象只能用于自增量ID.
		/// </summary>
		/// <param name="sqlstr"></param>
		/// <returns>返回新ID</returns>
		public object ExecuteReturnID(string sqlstr)
		{
			try
			{
				myConn.Open();

				SqlCommand cmd = new SqlCommand(sqlstr);
				cmd.Connection = myConn;
				cmd.ExecuteNonQuery();
				cmd.CommandText = "SELECT @@IDENTITY";
				return cmd.ExecuteScalar();
			}
			catch (Exception e)
			{
				throw (e);
			}
			finally
			{
				myConn.Close();
			}
		}*/
	}
}
